#ifndef KSAMP_OPTIONS_H
#define KSAMP_OPTIONS_H

#include "bstring/bstrlib.h"
#include <stdbool.h>

typedef enum {
	MODE_SIMPLE,     /* ksamp usado sin argumentos */
	MODE_STATISTICS, /* ksamp -s */
	MODE_LOOPED      /* ksamp -l <i> <d> */
} ksamp_mode;

/* Tipo opaco */
typedef struct _options_t Options;

/*** Inicialización y destrucción ***/
Options *parse_options (int argc, char **argv);
	/* Construye nuevas opciones, parseando a partir de `argc' y `argv' y
	 * validadando. argc y argv tienen la misma forma que los argumentos
	 * estándar de main ()).
	 *
	 * Acepta los siguientes: "ksamp" (el nombre del comando puede ser
	 * cualquier otro), "ksamp -s" y "ksamp -l <i> <d>" (donde i>0 e d>=0).
	 * "ksamp --help" se indica como inválido, pero se garantiza un mensaje
	 * de error vacío.
	 * Cualquier otra cosa es inválida, y se setea un mensaje de error
	 * no vacío.
	 *
	 * REQUIRES:
	 *     argc > 0
	 *     argv != NULL
	 * ENSURES:
	 *     Result != NULL
	 */


void options_destroy (Options *self);
	/* Destruye `self', liberando recursos asociados. 
	 * REQUIRES:
	 *     self != NULL
	 */

/*** Consultas ***/

bool options_is_valid (Options *self);
	/* True si se parseo un juego de opciones bien formado.
	 * REQUIRES:
	 *     self != NULL
	 */

ksamp_mode options_get_mode (Options *self);
	/* Modo de ksamp solicitado en las opciones parseadas
	 * REQUIRES:
	 *     self != NULL
	 *     options_is_valid (self)
	 */

int options_get_interval (Options *self);
	/* Intervalo entre ciclos solicitado en las opciones parseadas
	 * REQUIRES:
	 *     self != NULL
	 *     options_is_valid (self)
	 *     options_get_mode (self) == MODE_LOOPED
	 * ENSURES:
	 *     Result > 0
	 */

int options_get_duration (Options *self);
	/* Duración de la corrida solicitada en las opciones parseadas
	 * REQUIRES:
	 *     self != NULL
	 *     options_is_valid (self)
	 *     options_get_mode (self) == MODE_LOOPED
	 * ENSURES:
	 *     Result >= 0
	 */

const_bstring options_get_error (Options *self);
	/* Error detectado al validar
	 * REQUIRES:
	 *     self != NULL
	 *     !options_is_valid (self)
	 * ENSURES:
	 *     Result != NULL
	 */

#endif

